package com.t.bricks.bussiness.component.lucene;

//import java.util.List;
//
//import org.aspectj.lang.JoinPoint;
//import org.aspectj.lang.ProceedingJoinPoint;
//import org.aspectj.lang.annotation.AfterReturning;
//import org.aspectj.lang.annotation.Around;
//import org.aspectj.lang.annotation.Aspect;
//import org.aspectj.lang.annotation.Pointcut;
//import org.aspectj.lang.reflect.MethodSignature;
//import org.springframework.stereotype.Component;
//
//import com.t.bricks.bussiness.util.lucene.LuceneFactory;
//import com.t.bricks.model.Log;
//import com.t.bricks.model.MsgEmity;
//import com.t.bricks.model.OrderInfoList;
//import com.t.bricks.utils.function.reflect.ReflectUtil;
//import com.t.bricks.utils.spring.ModuleUtil;
//import com.t.bricks.utils.spring.SpringContextUtil;

/**
 * 搜索引擎切面子类,专门处理更新数据时的关联操作
 */
public class LuceneAspectChangeState {
//@Component
//@Aspect
//public class LuceneAspectChangeState extends LuceneAspectBase {
//
//	/**
//	 * 定义切入点，切入点为'MsgEmity com.t.bricks.bussiness.db.dao.*.impl.*DaoImpl.changeState(?)'下的changeState函数,并且函数只有一个参数
//	 */
//	@Pointcut(value = "execution(com.t.bricks.model.MsgEmity com.t.bricks.bussiness.db.dao.*.impl..*DaoImpl.changeState(..))")
//	//@Pointcut(value = "execution(* com.t.bricks.bussiness.db.dao.*.impl..*DaoImpl.*(..))")
//	@Override
//	public void doLuceneAspect() {
//	}
//    
//	/**
//	 * 后置/返回值增强
//     * @param joinPoint
//     * @param result 被切点方法执行后的返回值
//     * @return
//	 */
//	@AfterReturning(returning="result", pointcut="doLuceneAspect()")
//	public void afterReturning(JoinPoint joinPoint, Object result) {
//		if (!isCanAop) {
//			return;//不进行搜索引擎切面操作,退出
//		}
//		
//		if (!(result instanceof MsgEmity)) {//不是返回MsgEmity,则说明已经改变
//			MethodSignature signature = (MethodSignature) joinPoint.getSignature();
//			String methodName = signature.getMethod().getName();
//			Log.error("方法'", methodName, "'返回数据不是MsgEmity");
//			return;
//		}
//		
//		MsgEmity msgEmity = (MsgEmity)result;
//		if (!msgEmity.isSuccess()) {
//			return;//原方法执行失败,不处理
//		}
//		
//		edit(joinPoint, msgEmity);//多线程处理
//	}
//
//    /**
//     * 环绕通知
//     * @param joinPoint
//     * @return
//     * @throws Throwable
//     */
//	@Around("doLuceneAspect()")
//	@Override
//	public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
//		return joinPoint.proceed();//执行原切面中的预定方法后返回内容
//	}
//
//	/**
//	 * 更新数据
//	 * 注意:lucene的update比较特殊，update的代价太高，其实是先删除，然后在插入
//	 * @param joinPoint
//	 * @param msgEmity
//	 */
//	private void edit(JoinPoint joinPoint, MsgEmity msgEmity) {
//		ModuleUtil.runThread(() -> {//多线程方式重新构造缓存数据
//			Object[] args = joinPoint.getArgs();
//			if (null == args || args.length < 1) {
//				return;
//			}
//
//			crateLuceneCore(joinPoint, sLuceneIndexPath);//建立搜索库,不论是否成功都往下走
//			String core = getCore(joinPoint, sLuceneIndexPath);
//			if (null == core || "".equals(core)) {
//				return;//找不到库名不能更新
//			}
//			
//			String entityName = core.substring(core.lastIndexOf("/") +1);
//			
//			Class<?> entityClass = null;
//			try {
//				entityClass = Class.forName(
//						String.format("com.t.bricks.bussiness.db.entity.%s.base.%sBase", entityName.toLowerCase(), entityName));	
//			} catch (Exception e) {
//				return;//没有对应的类
//			}
//			
//			String idName = getKeyName(entityClass);
//			String idObj = String.valueOf(args[0]);
//			
//			Class<?> baseClass = ReflectUtil.findBaseClass(entityClass);
//			String tableName = baseClass.getSimpleName();
//			if (tableName.endsWith("Base")) {
//				tableName = tableName.substring(0, tableName.lastIndexOf("Base"));
//			}
//			
//			String whereStr = new StringBuilder()//表名前不能加"[dbo]."，否则sql会报错
//				.append(tableName)
//				.append(".").append(idName).append(" = ")
//				.append(("sId".equals(idName) || "uId".equals(idName)) ? "'" : "")
//				.append(idObj)
//				.append(("sId".equals(idName) || "uId".equals(idName)) ? "'" : "")
//				.toString();
//			
//			String beanName = getDaoBeanName(joinPoint);
//			
//			MsgEmity me = null;
//			
//			Object bean = SpringContextUtil.getBean(beanName);
//			if (ReflectUtil.hasMethod("findBySearch", bean, String.class, OrderInfoList.class, Class.class)) {
//				me = SpringContextUtil.doMethod(
//						beanName, "findBySearch",
//						new Class<?>[]{ String.class, OrderInfoList.class, Class.class },
//						new Object[]{ whereStr, null, entityClass });
//			} else {
//				me = SpringContextUtil.doMethod(
//						beanName, "findBySearch",
//						new Class<?>[]{ String.class, OrderInfoList.class },
//						new Object[]{ whereStr, null });
//			}
//			
//			if (null == me || !me.isSuccess()) {
//				Log.error("搜索引擎读取数据失败!");
//				return;
//			}
//			
//			me = me.getData();//SpringContextUtil.doMethod返回的data里面是MsgEmity
//			if (!me.isSuccess()) {
//				Log.error("Dao'", beanName, "'读取数据失败!");
//				return;
//			}
//			
//			List<?> list = me.getData();
//			if (list.size() < 1) {
//				return;
//			}
//			
//			LuceneFactory.update(idName, idObj, list.get(0), core);
//		});
//	}

}
